package com.frogermcs.androiddevmetrics.aspect;
import android.app.Activity;
import android.os.Debug;
import android.os.Environment;
import android.support.v4.app.FragmentActivity;
import com.frogermcs.androiddevmetrics.internal.MethodsTracingManager;
import com.frogermcs.androiddevmetrics.internal.metrics.ActivityLifecycleMetrics;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
/**
* Created by Miroslaw Stanek on 28.02.2016.
*/
@Aspect
public class ActivityLifecycleAnalyzer {
private static volatile boolean enabled = true;
public static void setEnabled(boolean enabled) {
ActivityLifecycleAnalyzer.enabled = enabled;
}
public static boolean isEnabled() {
return enabled;
}
public static final String METHOD_ON_CREATE = "onCreate";
public static final String METHOD_ON_START = "onStart";
public static final String METHOD_ON_RESUME = "onResume";
@Pointcut("execution(void *.onCreate(..)) && this(android.app.Activity+)")
public void onCreateMethod() {
}
@Pointcut("execution(void *.onStart(..)) && this(android.app.Activity+)")
public void onStartMethod() {
}
@Pointcut("execution(void *.onResume(..)) && this(android.app.Activity+)")
public void onResumeMethod() {
}
@Around("onCreateMethod() || onStartMethod() || onResumeMethod()")
public Object logAndExecute(ProceedingJoinPoint joinPoint) throws Throwable {
if (!enabled) return joinPoint.proceed();
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
String methodName = signature.getMethod().getName();
final Object result;
if (METHOD_ON_RESUME.equals(methodName)) {
ActivityLifecycleMetrics.getInstance().logPreOnResume((Activity) joinPoint.getTarget());
result = executeWithTracingIfEnabled(joinPoint, methodName);
ActivityLifecycleMetrics.getInstance().logPostOnResume((Activity) joinPoint.getTarget());
} else if (METHOD_ON_START.equals(methodName)) {
ActivityLifecycleMetrics.getInstance().logPreOnStart((Activity) joinPoint.getTarget());
result = executeWithTracingIfEnabled(joinPoint, methodName);
ActivityLifecycleMetrics.getInstance().logPostOnStart((Activity) joinPoint.getTarget());
} else if (METHOD_ON_CREATE.equals(methodName)) {
ActivityLifecycleMetrics.getInstance().logPreOnCreate((Activity) joinPoint.getTarget());
result = executeWithTracingIfEnabled(joinPoint, methodName);
ActivityLifecycleMetrics.getInstance().logPostOnCreate((Activity) joinPoint.getTarget());
} else {
result = null;
}
return result;
}
private Object executeWithTracingIfEnabled(ProceedingJoinPoint joinPoint, String methodName) throws Throwable {
final String targetName = joinPoint.getTarget().getClass().getName();
if (MethodsTracingManager.getInstance().shouldTraceMethod(targetName, methodName)) {
MethodsTracingManager.getInstance().disableMethodTracing(targetName, methodName);
String traceName = "/sdcard/" + joinPoint.getTarget().getClass().getSimpleName() + methodName + ".trace";
MethodsTracingManager.getInstance().addTracedMethod(traceName);
Debug.startMethodTracing(traceName);
Object result = joinPoint.proceed();
Debug.stopMethodTracing();
return result;
} else {
return joinPoint.proceed();
}
}
}